package com.qezhhnjy.leetcode.question.matrix;

/**
 * @author zhaoyangfu - 2020/12/7 0:28
 * 有一个二维矩阵 A 其中每个元素的值为 0 或 1 。
 * 移动是指选择任一行或列，并转换该行或列中的每一个值：将所有 0 都更改为 1，将所有 1 都更改为 0。
 * 在做出任意次数的移动后，将该矩阵的每一行都按照二进制数来解释，矩阵的得分就是这些数字的总和。
 * <p>
 * **返回尽可能高的分数。**
 * <p>
 * 示例：
 * <p>
 * 输入：[[0,0,1,1],[1,0,1,0],[1,1,0,0]]
 * 输出：39
 * 解释：
 * 转换为 [[1,1,1,1],[1,0,0,1],[1,1,1,1]]
 * 0b1111 + 0b1001 + 0b1111 = 15 + 9 + 15 = 39
 *  
 * <p>
 * 提示：
 * <p>
 * 1 <= A.length <= 20
 * 1 <= A[0].length <= 20
 * A[i][j] 是 0 或 1
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/score-after-flipping-matrix
 */
public class MatrixScore {

    public static int matrixScore(int[][] A) {
        // 行
        int m = A.length;
        // 列
        int n = A[0].length;
        // 每行最大的情况应该是第一位是1，每列最大的情况应该是1的个数最多。
        int result = m * (1 << n - 1);

        for (int[] row : A) {
            if (row[0] == 0) {
                for (int i = 0; i < n; i++) {
                    row[i] ^= 1;
                }
            }
        }

        //从第2列开始取每列0和1个数最多的那个
        for (int i = 1; i < n; i++) {
            int val1 = 0;
            for (int[] row : A) {
                val1 += row[i];
            }
            result += (1 << n - i - 1) * Math.max(val1, m - val1);
        }

        return result;
    }

    public static void main(String[] args) {
        System.out.println(matrixScore(new int[][]{new int[]{0, 0, 1, 1}, new int[]{1, 0, 1, 0}, new int[]{1, 1, 0, 0}}));
    }
}
